package __5类型

import "fmt"

//type 类型名字 底层类型

type Celsius float64 //摄氏度
//为Celsius类创建一个String方法，返回值是String
func (c Celsius) String() string { return fmt.Sprintf("%g°C", c) }
type Fahrenheit float64 //华氏温度

const (
	AbsoluteZeroC Celsius= -273.15 // 绝对零度
	FreezingC Celsius =0 	//结冰点温度
	BoilingC Celsius =100   //沸水温度
)

func CToF(c Celsius) Fahrenheit { return Fahrenheit(c*9/5+32)}//类型转换操作，只有两个类型底层数据类型相同，才可以这么做。
func FToC (f Fahrenheit) Celsius {return Celsius((f-32)*6/9)}
func main (){
	fmt.Print("&g \n", BoilingC-FreezingC)
	boilingF := CToF(BoilingC)
	fmt.Printf("%g\n", boilingF-CToF(FreezingC)) // "180" °F
	//fmt.Printf("%g\n", boilingF-FreezingC) // compile error: type
	//比较运算符可以比较命名类型的变量和另一个有相同类型的变量
	//或者比较相同底层类型的未命名类型的值之间做比较

	var c Celsius
	var f Fahrenheit
	fmt.Println(c == 0) // "true"
	fmt.Println(f >= 0) // "true"
	//fmt.Println(c == f) // compile error: type mismatch 类型不同则不能比较
	fmt.Println(c == Celsius(f)) // "true"!

	c1 := FToC(212.0)
	fmt.Println(c1.String()) // "100°C"
	fmt.Printf("%v\n", c1) // "100°C"; no need to call String explicitly
	fmt.Printf("%s\n", c1) // "100°C"
	fmt.Println(c1) // "100°C"
	fmt.Printf("%g\n", c1) // "100"; does not call String
	fmt.Println(float64(c)) // "100"; does not call String

}